package com.lanou3g.code0409.common;

/**
 * Created by dllo on 18/4/9.
 */

/*
* //内部实现原理
* String 是字符串常量,是出生了就不可能改变的量
* 当我们使用 +号在拼接字符串的时候,实际上发生了如下事件:(java虚拟机进行以下改写)
* 1.在编译时,java检测到你要拼接字符串了
* 2.在需要拼接的部位,创建一个StringBuilder
* 3.使用StringBuilder的append方法来拼接字符串
* 4/通过toString得到拼接后的值
* 5.将拼接后得到的值赋值给原来的String变量
* */



//比较二者区别 1. 常 变 2.若拼接buider比String效率高(循环内差异明显)  3.编译的class源码可看出 4.循环内需反复new
//若只拼接一个字符串,效率,内存上没有任何区别

public class TestString03 {
    public static void main(String[] args) {

        long a = System.nanoTime();

        String s = "Hello";

        StringBuilder sc = new StringBuilder(s);
        sc.append("World");
        s = sc.toString();



        s = s + "World";
        for (char c = 'A';c <= 'Z';c++){
            s = s + c;   //字符串拼接用'+'号

            StringBuilder sd = new StringBuilder(s);   //在循环内要开辟26块空间 外加循环外的一次共27次(同时 new 是一个耗时的操作)
            sd.append(c);
            s = sd.toString();


        }

        System.out.println(s);

        long b = System.nanoTime();
        System.out.println(b-a);
        // 以后再循环内拼接字符串,务必使用StringBuilder/StringBuffer(还没讲)

        StringBuilder sb = new StringBuilder("Hello");
        sb.append("World");
        for (char c = 'A';c <= 'Z';c++){
            sb.append(c);   // 只在循环外开辟一次空间
        }
        String ss = sb.toString();
        System.out.println(ss);

        long c = System.nanoTime(); //消耗的时间纳秒
        System.out.println(c-b);


    }
}
